home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_geomview.idb / usr / freeware / bin / hvectext.z / hvectext
Encoding:
Text File  |  1999-01-26  |  12.3 KB  |  514 lines

  1. :
  2. eval 'exec perl -S $0 ${1+"$@"}'
  3.                       if $running_under_some_shell;
  4.  
  5. # Copyright (c) 1995, Geometry Center, University of Minnesota
  6. # Script by Stuart Levy, Geometry Center.
  7. # Uses Hershey fonts as encoded for Ghostscript.
  8. # This program may be freely used and redistributed so long as
  9. # this notice remains.
  10.  
  11. # Configurable value: if you have Ghostscript Hershey fonts installed on your
  12. # system, you might want to set $gsfontdir to the directory where they live.
  13. # "-hershey" will seek files there if not found relative to ".".
  14. # This could be a colon-separated list of directories.
  15.  
  16. $gsfontpath = $ENV{"GS_FONTPATH"} || "/usr/local/lib/ghostscript/fonts";
  17.  
  18.  
  19. if (@ARGV == 0) {
  20.     print STDERR 
  21. "Usage: $0  [-w totallength] [-s textheight] [-plane xy|xz|yz] [-at X Y Z]
  22.     [-hershey fontfile.gsf] [-align n|s|e|w|ne|nw|se|sw|c] [--] text string
  23.  
  24. Generate geomview/OOGL vector-text object, of given height or total length
  25. (default -s .25), aligning the given corner of the text
  26. (default -align c (centered)) at given point (default -at 0 0 0).
  27. Accepts Ghostscript Hershey fonts; built-in default is Hershey-Plain-Simplex.
  28. ";
  29.     exit(1);
  30. }
  31.  
  32. @at = (0,0,0);
  33.  
  34. $ujust = -.5, $vjust = -.5;
  35. $uaxis = 0, $vaxis = 1;
  36. %ax = ('x',0, 'y',1, 'z',2,
  37.        0,'x', 1,'y', 2,'z');
  38.  
  39. ($cmdline = join(" ", $0, @ARGV)) =~ s/[\000-\031\177-\377]/sprintf("\\%03o",unpack("C",$1))/eg;
  40.  
  41. while(@ARGV) {
  42.     if($ARGV[0] =~ /^-w/) {
  43.     shift, $totallen = shift;
  44.     } elsif($ARGV[0] =~ /^-s/) {
  45.     shift, $height = shift;
  46.     } elsif($ARGV[0] =~ /^-pl?a?n?e?/) {
  47.     shift, $plane = shift;
  48.     $plane =~ tr/XYZ/xyz/;
  49.     $uaxis = $ax{substr($plane,0,1)};
  50.     $vaxis = $ax{substr($plane,1,1)};
  51.     unless ($uaxis != $vaxis && defined($uaxis) && defined($vaxis)) {
  52.         print STDERR
  53.           "$0: -plane: Expected \"xy\" or \"yz\" or \"xz\", not $plane.\n";
  54.         exit(0);
  55.     }
  56.     } elsif($ARGV[0] =~ /^-ali?g?n?/) {
  57.     shift, $align = shift;
  58.     $ujust = $vjust = -.5;
  59.     $ujust = -1 if $align =~ /e/i;
  60.     $ujust = 0 if $align =~ /w/i;
  61.     $vjust = -1 if $align =~ /n/i;
  62.     $vjust = 0 if $align =~ /s/i;
  63.     unless($align =~ /^[nsewc]+$/i) {
  64.         print STDERR
  65.           "$0: -align: Expected some combination of letters n s e w c\n";
  66.         exit(1);
  67.     }
  68.     } elsif($ARGV[0] =~ /^-at/) {
  69.     shift, @at = (shift,shift,shift);
  70.     } elsif($ARGV[0] =~ /^-her?s?h?e?y?/) {
  71.     shift, $gsfont = shift;
  72.     unless (-f $gsfont) {
  73.        foreach $_ (split(":", $gsfontpath)) {
  74.         ($gsfont = $_), last if -f ($_ .= "/" . $gsfont);
  75.        }
  76.     }
  77.     } elsif($ARGV[0] =~ /^--/) {
  78.     shift, last;
  79.     } else {
  80.     last;
  81.     }
  82. }
  83.  
  84. $chars{"space"} = " ";
  85. while(<DATA>) {
  86.     if(/CHARS/ .. /ENDCHARS/) {
  87.     ($name, $char) = split;
  88.     $chars{$name} = $char if length($char) == 1;
  89.     }
  90.     last if /^%END/;
  91. }
  92.  
  93. if($gsfont) {
  94.    local($_, $any);
  95.    $any = open(INF, $gsfont);
  96.    while(<INF>) {
  97.     last if /%END/;
  98.    }
  99.    if(/%END/) {
  100.     $INF = 'INF';
  101.    } else {
  102.     print STDERR $any
  103.       ? "$gsfont isn't a Ghostscript Hershey font -- no %END tag found.\n"
  104.       : "Can't open Ghostscript Hershey font file $gsfont, using default.\n";
  105.     $INF = 'DATA';
  106.    }
  107. } else {
  108.    $INF = 'DATA';
  109. }
  110.  
  111.  
  112. $aspect = .67;    # Width/height of typical character
  113. $fontscale = 1/33.;    # Hershey magic scale factor
  114. while(<$INF>) {
  115.     ($char, $xmin, $width, $codes) = (m'^/(\S+)\s*\[(\S+) (\S+) \(([^)]*)');
  116.     $char = $chars{$char} if length($char) > 1;
  117.     next unless defined($char);
  118.     $code{$char} = "$xmin,$width,$codes";
  119. }
  120.  
  121. $string = join(" ", @ARGV);
  122.  
  123. (print STDERR "$0: No string given?\n"), exit(1)
  124.     unless $string ne "";
  125.  
  126. %escapes = ("n", "\n", "b", "\b", "r", "\r", "e", "\e");
  127.  
  128. $string =~ s/\\([^0-7])/defined($escapes{$1}) ? $escapes{$1} : $1/eg;
  129. $string =~ s/\\([0-7][0-7]?[0-7]?)/pack("C",oct($1))/eg;
  130.  
  131. $stringwidth = 0;
  132.  
  133. foreach $char (split("", $string)) {
  134.    ($xmin,$xmax) = ($code{$char} =~ /([^,]+),([^,]+)/);
  135.    $stringwidth += $xmax - $xmin;
  136. }
  137. $stringwidth = 1 unless $stringwidth;
  138.  
  139. if($totallen) {
  140.    $strscale = $totallen / $stringwidth;
  141.    $height = $strscale * $aspect / $fontscale;
  142. } else {
  143.    $height = 0.25 unless($height>0);
  144.    $strscale = $fontscale * $height / $aspect;
  145.    $totallen = $strscale * $stringwidth;
  146. }
  147.  
  148.  
  149. @path = ();
  150. @counts = ();
  151.  
  152. # Interpret chars in string.
  153.  
  154. # Apply justification offset
  155. $at[$uaxis] += $ujust * $totallen;
  156. $at[$vaxis] += $vjust * $height;
  157.  
  158. foreach $ch (split("", $string)) {
  159.     ($xmin, $xmax, $paths) = split(",", $code{$ch});
  160.     $paths =~ s/\\([()\\])/$1/g;
  161.     foreach $arc (split(' ', $paths)) {
  162.     $u0 = -82-$xmin;
  163.     $v0 = -91;
  164.     @sites = unpack("C*",$arc);
  165.     printf STDERR "$0: internal error: tossing odd stroke for %s: '%s'\n", $ch, pop(@sites)
  166.         if(@sites & 1);
  167.     push(@counts, ($#sites+1)/2);
  168.     while($u = shift(@sites)) {
  169.         $v = shift(@sites);
  170.         @here = @at;
  171.         $here[$uaxis] += $strscale*($u+$u0);
  172.         $here[$vaxis] -= $strscale*($v+$v0);
  173.         push(@path, sprintf("%.7g %.7g %.7g", @here));
  174.     }
  175.     }
  176.     $at[$uaxis] += $strscale*($xmax-$xmin);
  177. }
  178.  
  179. ($safestring = $string) =~
  180.     s/[\000-\031\177-\377]/sprintf("\\%03o",unpack("C",$1))/eg;
  181.  
  182. printf "# Continue with: -align sw -plane %s%s -s %.6g -at %.6g %.6g %.6g\n",
  183.     $ax{$uaxis}, $ax{$vaxis}, $height, @at;
  184.  
  185. if(@counts > 0) {
  186.     print "VECT  # $safestring\n";
  187.     printf "%d %d 0 # %s\n", $#counts+1, ($#path+1), $cmdline;
  188.     print join(" ",@counts),"\n";
  189.     print "0 " x ($#counts+1), "\n\n";
  190.  
  191.     while(@path) {
  192.     print shift(@path), "\n";
  193.     }
  194. } else {
  195.     print "{ # $safestring\n";
  196.     print "} # $cmdline\n";
  197. }
  198.  
  199.  
  200. __END__
  201.  
  202. CHARS
  203. exclam !
  204. quotedbl "
  205. numbersign #
  206. dollar $
  207. percent %
  208. ampersand &
  209. quotesingle '
  210. parenleft (
  211. parenright )
  212. asterisk *
  213. plus +
  214. comma ,
  215. hyphen -
  216. period .
  217. slash /
  218. zero 0
  219. one 1
  220. two 2
  221. three 3
  222. four 4
  223. five 5
  224. six 6
  225. seven 7
  226. eight 8
  227. nine 9
  228. colon :
  229. semicolon ;
  230. less <
  231. equal =
  232. greater >
  233. question ?
  234. bracketleft [
  235. backslash \
  236. bracketright ]
  237. asciicircum ^
  238. underscore _
  239. quoteleft `
  240. braceleft {
  241. bar |
  242. braceright }
  243. asciitilde ~
  244. tilde ~
  245. universal "
  246. existential $
  247. suchthat '
  248. asteriskmath *
  249. congruent @
  250. Alpha A
  251. Beta B
  252. Chi C
  253. Delta D
  254. Epsilon E
  255. Phi F
  256. Gamma G
  257. Eta H
  258. Iota I
  259. theta1 J
  260. Kappa K
  261. Lambda L
  262. Mu M
  263. Nu N
  264. Omicron O
  265. Pi P
  266. Theta Q
  267. Rho R
  268. Sigma S
  269. Tau T
  270. Upsilon U
  271. sigma1 V
  272. Omega W
  273. Xi X
  274. Psi Y
  275. Zeta Z
  276. therefore \
  277. perpendicular ^
  278. radicalex `
  279. alpha a
  280. beta b
  281. chi c
  282. delta d
  283. epsilon e
  284. phi f
  285. gamma g
  286. eta h
  287. iota i
  288. phi1 j
  289. kappa k
  290. lambda l
  291. mu m
  292. nu n
  293. omicron o
  294. pi p
  295. theta q
  296. rho r
  297. sigma s
  298. tau t
  299. upsilon u
  300. omega1 v
  301. omega w
  302. xi x
  303. psi y
  304. zeta z
  305. similar ~
  306. Upsilon1 í
  307. minute ó
  308. lessequal ú
  309. fraction ñ
  310. infinity Ñ
  311. florin ª
  312. club º
  313. diamond ¿
  314. heart ⌐
  315. spade ¬
  316. arrowboth ½
  317. arrowleft ¼
  318. arrowup ¡
  319. arrowright «
  320. arrowdown »
  321. degree ░
  322. plusminus ▒
  323. second ▓
  324. greaterequal │
  325. multiply ┤
  326. proportional ╡
  327. partialdiff ╢
  328. bullet ╖
  329. divide ╕
  330. notequal ╣
  331. equivalence ║
  332. approxequal ╗
  333. ellipsis ╝
  334. arrowvertex ╜
  335. arrowhorizex ╛
  336. carriagereturn ┐
  337. aleph └
  338. Ifraktur ┴
  339. Rfraktur ┬
  340. weierstrass ├
  341. circlemultiply ─
  342. circleplus ┼
  343. emptyset ╞
  344. intersection ╟
  345. union ╚
  346. propersuperset ╔
  347. reflexsuperset ╩
  348. notsubset ╦
  349. propersubset ╠
  350. reflexsubset ═
  351. element ╬
  352. notelement ╧
  353. angle ╨
  354. gradient ╤
  355. registerserif ╥
  356. copyrightserif ╙
  357. trademarkserif ╘
  358. product ╒
  359. radical ╓
  360. dotmath ╫
  361. logicalnot ╪
  362. logicaland ┘
  363. logicalor ┌
  364. arrowdblboth █
  365. arrowdblleft ▄
  366. arrowdblup ▌
  367. arrowdblright ▐
  368. arrowdbldown ▀
  369. lozenge α
  370. angleleft ß
  371. registersans Γ
  372. copyrightsans π
  373. trademarksans Σ
  374. summation σ
  375. parenlefttp µ
  376. parenleftex τ
  377. parenleftbt Φ
  378. bracketlefttp Θ
  379. bracketleftex Ω
  380. bracketleftbt δ
  381. bracelefttp ∞
  382. braceleftmid φ
  383. braceleftbt ε
  384. braceex ∩
  385. angleright ±
  386. integral ≥
  387. integraltp ≤
  388. integralex ⌠
  389. integralbt ⌡
  390. parenrighttp ÷
  391. parenrightex ≈
  392. parenrightbt °
  393. bracketrighttp ∙
  394. bracketrightex ·
  395. bracketrightbt √
  396. bracerighttp ⁿ
  397. bracerightmid ²
  398. bracerightbt ■
  399. ENDCHARS
  400.  
  401. # Now for our default font.
  402. # Boilerplate header from Ghostscript font hrpl_s.gsf omitted.
  403. %END
  404.  
  405. 150 dict dup begin
  406. /A [-8 9 (RFJ[ RFZ[ MTWT)] def
  407. /B [-10 10 (KFK[ KFTFWGXHYJYLXNWOTP KPTPWQXRYTYWXYWZT[K[)] def
  408. /C [-9 11 (ZKYIWGUFQFOGMILKKNKSLVMXOZQ[U[WZYXZV)] def
  409. /D [-10 10 (KFK[ KFRFUGWIXKYNYSXVWXUZR[K[)] def
  410. /E [-9 9 (LFL[ LFYF LPTP L[Y[)] def
  411. /F [-9 8 (LFL[ LFYF LPTP)] def
  412. /G [-9 11 (ZKYIWGUFQFOGMILKKNKSLVMXOZQ[U[WZYXZVZS USZS)] def
  413. /H [-10 11 (KFK[ YFY[ KPYP)] def
  414. /I [-3 4 (RFR[)] def
  415. /J [-7 8 (VFVVUYTZR[P[NZMYLVLT)] def
  416. /K [-10 10 (KFK[ YFKT POY[)] def
  417. /L [-9 7 (LFL[ L[X[)] def
  418. /M [-11 12 (JFJ[ JFR[ ZFR[ ZFZ[)] def
  419. /N [-10 11 (KFK[ KFY[ YFY[)] def
  420. /O [-10 11 (PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF)] def
  421. /P [-10 10 (KFK[ KFTFWGXHYJYMXOWPTQKQ)] def
  422. /Q [-10 11 (PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF SWY])] def
  423. /R [-10 10 (KFK[ KFTFWGXHYJYLXNWOTPKP RPY[)] def
  424. /S [-9 10 (YIWGTFPFMGKIKKLMMNOOUQWRXSYUYXWZT[P[MZKX)] def
  425. /T [-8 8 (RFR[ KFYF)] def
  426. /U [-11 11 (KFKULXNZQ[S[VZXXYUYF)] def
  427. /V [-9 10 (JFR[ ZFR[)] def
  428. /W [-13 12 (HFM[ RFM[ RFW[ \\FW[)] def
  429. /X [-10 10 (KFY[ YFK[)] def
  430. /Y [-9 9 (JFRPR[ ZFRP)] def
  431. /Z [-10 10 (YFK[ KFYF K[Y[)] def
  432. /a [-8 10 (XMX[ XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def
  433. /b [-9 9 (LFL[ LPNNPMSMUNWPXSXUWXUZS[P[NZLX)] def
  434. /c [-8 9 (XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def
  435. /d [-8 10 (XFX[ XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def
  436. /e [-8 9 (LSXSXQWOVNTMQMONMPLSLUMXOZQ[T[VZXX)] def
  437. /f [-4 7 (WFUFSGRJR[ OMVM)] def
  438. /g [-8 10 (XMX]W`VaTbQbOa XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def
  439. /h [-8 10 (MFM[ MQPNRMUMWNXQX[)] def
  440. /i [-3 4 (QFRGSFREQF RMR[)] def
  441. /j [-4 5 (RFSGTFSERF SMS^RaPbNb)] def
  442. /k [-8 8 (MFM[ WMMW QSX[)] def
  443. /l [-3 4 (RFR[)] def
  444. /m [-14 15 (GMG[ GQJNLMOMQNRQR[ RQUNWMZM\\N]Q][)] def
  445. /n [-8 10 (MMM[ MQPNRMUMWNXQX[)] def
  446. /o [-8 10 (QMONMPLSLUMXOZQ[T[VZXXYUYSXPVNTMQM)] def
  447. /p [-9 9 (LMLb LPNNPMSMUNWPXSXUWXUZS[P[NZLX)] def
  448. /q [-8 10 (XMXb XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def
  449. /r [-6 7 (OMO[ OSPPRNTMWM)] def
  450. /s [-7 9 (XPWNTMQMNNMPNRPSUTWUXWXXWZT[Q[NZMX)] def
  451. /t [-5 7 (RFRWSZU[W[ OMVM)] def
  452. /u [-8 10 (MMMWNZP[S[UZXW XMX[)] def
  453. /v [-7 8 (LMR[ XMR[)] def
  454. /w [-11 11 (JMN[ RMN[ RMV[ ZMV[)] def
  455. /x [-7 9 (MMX[ XMM[)] def
  456. /y [-7 8 (LMR[ XMR[P_NaLbKb)] def
  457. /z [-7 9 (XMM[ MMXM M[X[)] def
  458. /zero [-10 10 (QFNGLJKOKRLWNZQ[S[VZXWYRYOXJVGSFQF)] def
  459. /one [-10 10 (NJPISFS[)] def
  460. /two [-10 10 (LKLJMHNGPFTFVGWHXJXLWNUQK[Y[)] def
  461. /three [-10 10 (MFXFRNUNWOXPYSYUXXVZS[P[MZLYKW)] def
  462. /four [-10 10 (UFKTZT UFU[)] def
  463. /five [-10 10 (WFMFLOMNPMSMVNXPYSYUXXVZS[P[MZLYKW)] def
  464. /six [-10 10 (XIWGTFRFOGMJLOLTMXOZR[S[VZXXYUYTXQVOSNRNOOMQLT)] def
  465. /seven [-10 10 (YFO[ KFYF)] def
  466. /eight [-10 10 (PFMGLILKMMONSOVPXRYTYWXYWZT[P[MZLYKWKTLRNPQOUNWMXKXIWGTFPF)] def
  467. /nine [-10 10 (XMWPURRSQSNRLPKMKLLINGQFRFUGWIXMXRWWUZR[P[MZLX)] def
  468. /period [-5 5 (RYQZR[SZRY)] def
  469. /comma [-5 5 (SZR[QZRYSZS\\R^Q_)] def
  470. /colon [-5 5 (RMQNROSNRM RYQZR[SZRY)] def
  471. /semicolon [-5 5 (RMQNROSNRM SZR[QZRYSZS\\R^Q_)] def
  472. /exclam [-7 7 (RFRT RYQZR[SZRY)] def
  473. /question [-9 9 (LKLJMHNGPFTFVGWHXJXLWNVORQRT RYQZR[SZRY)] def
  474. /quotedbl [-8 8 (NFNM VFVM)] def
  475. /ring [-7 7 (QFOGNINKOMQNSNUMVKVIUGSFQF)] def
  476. /dollar [-10 10 (PBP_ TBT_ YIWGTFPFMGKIKKLMMNOOUQWRXSYUYXWZT[P[MZKX)] def
  477. /fraction [-11 11 ([BIb)] def
  478. /parenleft [-7 5 (VBTDRGPKOPOTPYR]T`Vb)] def
  479. /parenright [-5 7 (NBPDRGTKUPUTTYR]P`Nb)] def
  480. /bar [-4 4 (RBRb)] def
  481. /hyphen [-13 13 (IR[R)] def
  482. /plus [-13 13 (RIR[ IR[R)] def
  483. /equal [-13 13 (IO[O IU[U)] def
  484. /periodcentered [-5 5 (RQQRRSSRRQ)] def
  485. /quoteleft [-5 5 (SFRGQIQKRLSKRJ)] def
  486. /quoteright [-5 5 (RHQGRFSGSIRKQL)] def
  487. /numbersign [-10 11 (SBLb YBRb LOZO KUYU)] def
  488. /ampersand [-13 13 (\\O\\N[MZMYNXPVUTXRZP[L[JZIYHWHUISJRQNRMSKSIRGPFNGMIMKNNPQUXWZY[[[\\Z\\Y)] def
  489. /bullet [-2 2 (QPPQPSQTSTTSTQSPQP RQQRRSSRRQ)] def
  490. /slash [-7 7 (K^YF)] def
  491. /backslash [-7 7 (KFY^)] def
  492. /underscore [-8 8 (J]Z])] def
  493. /tilde [-8 8 (LTLRMPOPUSWSXR LRMQOQUTWTXRXP)] def
  494. /bracketleft [-7 7 (OBOb PBPb OBVB ObVb)] def
  495. /bracketright [-7 7 (TBTb UBUb NBUB NbUb)] def
  496. /braceleft [-7 7 (TBRCQDPFPHQJRKSMSOQQ RCQEQGRISJTLTNSPORSTTVTXSZR[Q]Q_Ra QSSUSWRYQZP\\P^Q`RaTb)] def
  497. /braceright [-7 7 (PBRCSDTFTHSJRKQMQOSQ RCSESGRIQJPLPNQPURQTPVPXQZR[S]S_Ra SSQUQWRYSZT\\T^S`RaPb)] def
  498. /asterisk [-8 8 (RFRR MIWO WIMO)] def
  499. /less [-12 12 (ZIJRZ[)] def
  500. /greater [-12 12 (JIZRJ[)] def
  501. /asciitilde [-12 12 (IUISJPLONOPPTSVTXTZS[Q ISJQLPNPPQTTVUXUZT[Q[O)] def
  502. /asciicircum [-11 11 (JTROZT JTRPZT)] def
  503. /breve [-10 10 (KFLHNJQKSKVJXHYF KFLINKQLSLVKXIYF)] def
  504. /percent [-12 12 ([FI[ NFPHPJOLMMKMIKIIJGLFNFPGSHVHYG[F WTUUTWTYV[X[ZZ[X[VYTWT)] def
  505. /at [-13 14 (WNVLTKQKOLNMMPMSNUPVSVUUVS QKOMNPNSOUPV WKVSVUXVZV\\T]Q]O\\L[JYHWGTFQFNGLHJJILHOHRIUJWLYNZQ[T[WZYYZX XKWSWUXV)] def
  506. /section [-8 8 (UITJUKVJVIUGSFQFOGNINKOMQOVR OMTPVRWTWVVXTZ PNNPMRMTNVPXU[ NVSYU[V]V_UaSbQbOaN_N^O]P^O_)] def
  507. /dagger [-8 8 (RFQHRJSHRF RFRb RQQTRbSTRQ LMNNPMNLLM LMXM TMVNXMVLTM)] def
  508. /daggerdbl [-8 8 (RFQHRJSHRF RFRT RPQRSVRXQVSRRP RTRb R^Q`RbS`R^ LMNNPMNLLM LMXM TMVNXMVLTM L[N\\P[NZL[ L[X[ T[V\\X[VZT[)] def
  509. /space [-4 4 ()] def
  510. /quotesingle [-4 5 (SFRGRM SGRM SFTGRM)] def
  511. /.notdef [ 0 0 () ] def        % not defined
  512. end
  513. /Hershey-Plain-Simplex 4294100 0.8 0 MakeHersheyFont
  514.